home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / misc / amoricv0.lha / AmoricV0_8a / src / CPUmacros.asm < prev    next >
Assembly Source File  |  1995-09-28  |  5KB  |  356 lines

  1. ;***************************************************
  2. ;*************** MODES D'ADRESSAGE *****************
  3. ;***************************************************
  4.  
  5. ;*** Le mode d'adressage immediat est programme directement pour optimiser
  6.  
  7. ZERO_PAGE: MACRO    
  8.     moveq.l    #0,D6
  9.     move.b    (A4)+,D6
  10.     ENDM
  11.  
  12. ZERO_PAGE_X: MACRO
  13.     ZERO_PAGE
  14.     add.b    D2,D6        ; +X sans changement de page quoi qu'il arrive
  15.     ENDM
  16.     
  17. ZERO_PAGE_Y: MACRO
  18.     ZERO_PAGE
  19.     add.b    D3,D6        ; +Y sans changement de page quoi qu'il arrive
  20.     ENDM
  21.  
  22. ABSOLU: MACRO
  23.     moveq.l    #0,D6
  24.     move.b    (A4)+,D6
  25.     lsl.w    #8,D6
  26.     move.b    (A4)+,D6
  27.     rol.w    #8,D6
  28.     ENDM    
  29.     
  30. ABSOLU_X: MACRO
  31.     ABSOLU
  32.     add.w    D2,D6        ; +X
  33.     ENDM        
  34.  
  35. ABSOLU_Y: MACRO
  36.     ABSOLU
  37.     add.w    D3,D6        ; +Y
  38.     ENDM        
  39.  
  40. INDIRECT: MACRO        
  41.     moveq.l    #0,D6
  42.     moveq.l    #0,D7
  43.  
  44.     move.b    (A4)+,D7
  45.     lsl.w    #8,D7
  46.     move.b    (A4)+,D7
  47.     rol.w    #8,D7
  48.  
  49.     move.b    $1(A0,D7.L),D6
  50.     lsl.w    #8,D6
  51.     move.b    (A0,D7.L),D6    
  52.     ENDM
  53.     
  54. ZERO_PAGE_INDIRECT_X: MACRO
  55.     moveq.l    #0,D6
  56.     moveq.l    #0,D7
  57.     move.b    (A4)+,D7
  58.     add.w    D2,D7        ; +X
  59.     move.b    $1(A0,D7.L),D6
  60.     lsl.w    #8,D6
  61.     move.b    (A0,D7.L),D6    
  62.     ENDM
  63.  
  64. ZERO_PAGE_INDIRECT_Y: MACRO
  65.     moveq.l    #0,D6
  66.     moveq.l    #0,D7
  67.     move.b    (A4)+,D7
  68.     move.b    $1(A0,D7.L),D6
  69.     lsl.w    #8,D6
  70.     move.b    (A0,D7.L),D6    
  71.     add.w    D3,D6        ; +Y    
  72.     ENDM
  73.  
  74.     
  75. ; *** Macros Test des drapeaux ***
  76.  
  77. ; *** N et Z
  78.  
  79. TEST_NZ: MACRO
  80.      move    ccr,d0
  81.     andi.w    #%00001100,d0    ; Bits Z et N
  82.     andi.b    #%01111101,d4   ; (bits N et Z de P a 0)
  83.     or.b    TabNZ-TabP(A3,D0.W),D4
  84.     ENDM
  85.  
  86.         
  87. ; *** Macro Test des drapeaux N,Z et C ***
  88.     
  89. TEST_NZC: MACRO
  90.      move    ccr,d0
  91.     andi.w    #%00001101,d0    ; Bits Z,N et C
  92.     andi.b    #%01111100,d4   ; (bits N,Z et C de P a 0)
  93.     or.b    TabNZC-TabP(A3,D0.W),D4
  94.     ENDM
  95.  
  96. ; *** Macro Test des drapeaux N,Z,C et V ***
  97.     
  98. TEST_NZCV: MACRO
  99.      move    ccr,d0
  100.     andi.w    #%00001111,d0    ; Bits Z,N,C et V
  101.     andi.b    #%00111100,d4   ; (bits N,V,Z et C de P a 0)
  102.     or.b    TabNZCV-TabP(A3,D0.W),D4
  103.     ENDM
  104.  
  105. ; *** Mettre Z de CCR a 0 et X en fction de C de P
  106.  
  107. SET_C2X:MACRO
  108.     move    ccr,D0
  109.     TST_PB    C_BIT
  110.     beq.b    SCX_NoCarry\@
  111.     bset    #4,D0
  112.     bra.b    SCX_End\@
  113. SCX_NoCarry\@:
  114.     bclr    #4,D0
  115. SCX_End\@:
  116.     move    D0,ccr
  117.     ENDM
  118.  
  119. SET_XZ_ADC:MACRO
  120.     move    ccr,D0
  121.     TST_PB    C_BIT
  122.     beq.b    SXZA_NoCarry\@
  123.     bset    #4,D0
  124.     bra.b    SXZA_End\@
  125. SXZA_NoCarry\@:
  126.     bclr    #4,D0
  127. SXZA_End\@:
  128.     bset    #2,D0    ; Mettre Z a 1
  129.     move    D0,ccr
  130.     ENDM
  131.  
  132. SET_XZ_SBC:MACRO
  133.     move    ccr,D0
  134.     TST_PB    C_BIT
  135.     bne.b    SXZS_NoCarry\@
  136.     bset    #4,D0
  137.     bra.b    SXZS_End\@
  138. SXZS_NoCarry\@:
  139.     bclr    #4,D0
  140. SXZS_End\@:
  141.     bset    #2,D0    ; Mettre Z a 1
  142.     move    D0,ccr
  143.     ENDM
  144.  
  145. ; *** Macros Tests NZC pour CMP,CPX,CPY ***
  146.  
  147. TEST_CMP: MACRO
  148.      move    ccr,d0
  149.     andi.w    #%00001101,d0    ; Bits Z,N et C
  150.     andi.b    #%01111100,d4   ; (bits N,Z et C de P a 0)
  151.     or.b    TabNZC_CMP-TabP(A3,D0.W),D4
  152.     ENDM
  153.  
  154.         
  155. BRANCH: MACRO
  156.     btst    #\1,D4
  157.     beq.b    BRANCH_NON\@
  158.     moveq.l    #0,D6
  159.     move.b    (A4),D6
  160.     bmi.B    Reverse\@
  161.     add.l    D6,A4
  162.     addq.l    #1,A4
  163.     GOOD_INST
  164. Reverse\@: 
  165.     eor.b    #$FF,D6
  166.     sub.l    D6,A4
  167.     GOOD_INST
  168. BRANCH_NON\@: 
  169.     addq.l    #1,A4
  170.     GOOD_INST
  171.     ENDM
  172.     
  173. DONT_BRANCH: MACRO
  174.     btst    #\1,D4
  175.     bne.b    DONT_BRANCH_NON\@
  176.     moveq.l    #0,D6
  177.     move.b    (A4),D6
  178.     bmi.B    DONT_Reverse\@
  179.     add.l    D6,A4
  180.     addq.l    #1,A4
  181.     GOOD_INST
  182. DONT_Reverse\@:
  183.     eor.b    #$FF,D6
  184.     sub.l    D6,A4
  185.     GOOD_INST
  186. DONT_BRANCH_NON\@:
  187.     addq.l    #1,A4
  188.     GOOD_INST
  189.     ENDM
  190.  
  191. CLEAR_BIT_P: MACRO
  192.     bclr    #\1,D4
  193.     GOOD_INST
  194.     ENDM
  195.             
  196. SET_BIT_P: MACRO
  197.     bset    #\1,D4
  198.     GOOD_INST
  199.     ENDM
  200.             
  201. MODESADD: MACRO
  202. \1_ZRP        ; *** PAGE ZERO ***
  203.     ZERO_PAGE
  204.     bra    \1
  205. \1_ZRPX        ; *** PAGE ZERO INDEXE X ***
  206.     ZERO_PAGE_X
  207.     bra    \1
  208. \1_ZRPY        ; *** PAGE ZERO INDEXE Y ***
  209.     ZERO_PAGE_Y
  210.     bra    \1
  211. \1_ABS        ; *** ABSOLU ***
  212.     ABSOLU
  213.     bra    \1
  214. \1_ABSX        ; *** ABSOLU INDEXE X ***
  215.     ABSOLU_X
  216.     bra    \1
  217. \1_ABSY        ; *** ABSOLU INDEXE Y ***
  218.     ABSOLU_Y
  219.     bra    \1
  220. \1_INDX        ; *** ZERO PAGE INDIRECT X ***
  221.     ZERO_PAGE_INDIRECT_X
  222.     bra    \1
  223. \1_INDY        ; *** ZERO PAGE INDIRECT Y ***
  224.     ZERO_PAGE_INDIRECT_Y
  225.     bra    \1
  226.     ENDM
  227.  
  228. LDz:MACRO
  229.     move.b    (A0,D6.L),\1
  230.     TEST_NZ    \1
  231.     GOOD_INST
  232.     ENDM
  233.  
  234. LDz_IMM:MACRO
  235.     move.b    (A4)+,\1
  236.     TEST_NZ    \1
  237.     GOOD_INST
  238.     ENDM
  239.  
  240. STz:MACRO
  241.     move.b    \1,D7
  242.     jsr    @Place
  243.     GOOD_INST
  244.     ENDM
  245.  
  246. CPz:MACRO
  247.     move.b    (A0,D6.L),D7
  248.     cmp.b    \1,D7
  249.     TEST_CMP
  250.     GOOD_INST
  251.     ENDM
  252.  
  253. CPz_IMM:MACRO
  254.     move.b    (A4)+,D7
  255.     cmp.b    \1,D7
  256.     TEST_CMP
  257.     GOOD_INST
  258.     ENDM
  259.  
  260. Txy:MACRO
  261.     move.b    \1,\2
  262.     TEST_NZ
  263.     GOOD_INST    
  264.     ENDM
  265.  
  266. EMPILER: MACRO
  267.     subq.b    #1,D5
  268.     move.b    \1,1(A0,D5.L) ; il faut faire le move en dernier
  269.     ENDM
  270.         
  271. DEPILER: MACRO
  272.     addq.b    #1,D5
  273.     move.b    (A0,D5.L),\1
  274.     ENDM
  275.     
  276.  
  277. SAVE_ADR:MACRO
  278.     move.w    A4,D6
  279.     subq.l    #1,D6
  280.     sub.l    A0,D6
  281.     move.w    D6,D0
  282.     lsr.w    #8,D6
  283.     EMPILER D6
  284.     EMPILER D0
  285.     ENDM
  286.  
  287. RESTORE_ADR:MACRO
  288.     moveq.l    #0,D0
  289.     DEPILER    D6
  290.     DEPILER    D0                    
  291.     lsl.w    #8,D0
  292.     move.b    D6,D0
  293.     move.l    A0,A4
  294.     add.l    D0,A4
  295.     ENDM
  296.  
  297. BIT_MACRO:MACRO
  298.     move.b    D1,D7
  299.     and.b    D6,D7
  300.     bne.b    BIT_NZERO\@
  301.     SET_PB    Z_BIT
  302.     bra.b    BIT_FIN\@
  303. BIT_NZERO\@
  304.     CLR_PB    Z_BIT    
  305. BIT_FIN\@
  306.     ANDI.B    #$3F,D4
  307.     move.b    D6,D7
  308.     ANDI.B    #$C0,D7        ; Bits 6 et 7
  309.     OR.B    D7,D4
  310.     ENDM
  311.  
  312. ADC_MACRO:MACRO
  313.     btst    #D_BIT,D4
  314.     bne.w    ADCDecimal\@
  315. ADCBinary\@:
  316.     SET_XZ_ADC        ; Prepare Z=1 et X en fonction de C de P
  317.     addx.b    D7,D1
  318.     TEST_NZCV
  319.     GOOD_INST
  320.  
  321. ADCDecimal\@:
  322.     SET_XZ_ADC
  323.     ABCD.B    D7,D1
  324.     TEST_NZCV    ; en fait N est indefini
  325.     CLR_PB    V_BIT
  326.     GOOD_INST
  327.     ENDM
  328.  
  329. SBC_MACRO:MACRO
  330.     btst    #D_BIT,D4
  331.     bne    SBCDecimal\@
  332.     
  333.     ; *** Mode Binaire
  334.  
  335. SBCBinary\@:
  336.     SET_XZ_SBC
  337.     subx.b    D7,D1
  338.     TEST_NZCV
  339.     CHG_PB    C_BIT    ; Inverser la retenue par rapport au 68000
  340.     GOOD_INST
  341.  
  342. SBCDecimal\@:
  343.     CHG_PB    C_BIT    ; Inverser la retenue par rapport au 68000
  344.     SET_XZ_SBC
  345.     SBCD.B    D7,D1
  346.     TEST_NZCV    ; en fait N est indefini
  347.     CLR_PB    V_BIT
  348.     GOOD_INST
  349.     ENDM
  350.  
  351. GET_WORD:MACRO
  352.     move.l    A0,A4
  353.     add.l    #\1,A4
  354.     ABSOLU
  355.     ENDM
  356.